
-- Establecemos el contexto, la base de datos FourHoteles por si no la tenemos seleccionada.
USE FourHoteles;
GO

/*** ELIMINAMOS LAS TABLAS YA CREADAS PARA CREAR TODO DESDE CERO ***/
-- --------------------------------------------------
-- Se eliminan las posibles Foreign Keys de las tablas
-- --------------------------------------------------

IF OBJECT_ID('FK_HabitacionesReservas', 'F') IS NOT NULL
    ALTER TABLE Reservas DROP CONSTRAINT FK_HabitacionesReservas;
GO
IF OBJECT_ID('FK_HotelesHabitaciones', 'F') IS NOT NULL
    ALTER TABLE Habitaciones DROP CONSTRAINT FK_HotelesHabitaciones;
GO
IF OBJECT_ID('FK_ImagenesHoteles', 'F') IS NOT NULL
    ALTER TABLE Imagenes DROP CONSTRAINT FK_ImagenesHoteles;
GO
IF OBJECT_ID('FK_ReservasUsuarios', 'F') IS NOT NULL
    ALTER TABLE Reservas DROP CONSTRAINT FK_ReservasUsuarios;
GO
IF OBJECT_ID('FK_HotelesReservas', 'F') IS NOT NULL
    ALTER TABLE Reservas DROP CONSTRAINT FK_HotelesReservas;
GO
IF OBJECT_ID('FK_CadenasHoteles', 'F') IS NOT NULL
    ALTER TABLE Hoteles DROP CONSTRAINT FK_CadenasHoteles;
GO

-- --------------------------------------------------
-- Se eliminan las tablas
-- --------------------------------------------------

IF OBJECT_ID('Habitaciones', 'U') IS NOT NULL
    DROP TABLE Habitaciones;
GO
IF OBJECT_ID('Hoteles', 'U') IS NOT NULL
    DROP TABLE Hoteles;
GO
IF OBJECT_ID('Imagenes', 'U') IS NOT NULL
    DROP TABLE Imagenes;
GO
IF OBJECT_ID('Reservas', 'U') IS NOT NULL
    DROP TABLE Reservas;
GO
IF OBJECT_ID('Usuarios', 'U') IS NOT NULL
    DROP TABLE Usuarios;
GO
IF OBJECT_ID('Cadenas', 'U') IS NOT NULL
    DROP TABLE Cadenas;
GO
IF OBJECT_ID('Administradores', 'U') IS NOT NULL
    DROP TABLE Administradores;
GO

/*** CREAMOS LAS TABLAS ***/

-- --------------------------------------------------
-- Creación de tablas
-- --------------------------------------------------

-- Se crea la tabla 'Habitaciones'
CREATE TABLE Habitaciones (
    Id int IDENTITY(1,1) NOT NULL,
    HotelesId int  NOT NULL,
    Tipo nvarchar(20)  NOT NULL,
    Descripcion nvarchar(200)  NOT NULL,
    Precio_Noche decimal(18,2)  NOT NULL
);
GO

-- Se crea la tabla 'Hoteles'
CREATE TABLE Hoteles (
    Id int IDENTITY(1,1) NOT NULL,
    Nombre nvarchar(25)  NOT NULL,
    CadenasId int  NOT NULL,
    Descripcion nvarchar(500)  NOT NULL,
    Num_Habitaciones int  NOT NULL,
    Direccion nvarchar(50)  NOT NULL,
    Poblacion nvarchar(40)  NOT NULL,
    Provincia nvarchar(25)  NOT NULL,
    Telefono nvarchar(30)  NOT NULL,
    Clasificacion int  NOT NULL,
    Num_Votos int  NOT NULL,
    Puntuacion float  NOT NULL,
    Wifi bit  NOT NULL,
    Parking bit  NOT NULL,
    Restaurante bit  NOT NULL,
    Salones_Reuniones bit  NOT NULL,
    Gimnasio bit  NOT NULL,
    Mascotas bit  NOT NULL,
    Piscina bit  NOT NULL,
    SpaRelax bit  NOT NULL,
    Otros_Servicios nvarchar(150)  NOT NULL,
    Entrada time  NOT NULL,
    Salida time  NOT NULL,
    Observaciones nvarchar(100)  NOT NULL,
    DiasParaCancelar int  NOT NULL,
    Imagen_Portada nvarchar(150)  NOT NULL
);
GO

-- Se crea la tabla 'Imagenes'
CREATE TABLE Imagenes (
    Id int IDENTITY(1,1) NOT NULL,
    HotelesId int  NOT NULL,
    Ruta_Imagen nvarchar(150)  NOT NULL
);
GO

-- Se crea la tabla 'Reservas'
CREATE TABLE Reservas (
    Id int IDENTITY(1,1) NOT NULL,
    HabitacionesId int  NOT NULL,
    UsuariosId int  NOT NULL,
    Tarjeta_Credito nvarchar(20)  NOT NULL,
    Fecha_Entrada datetime  NOT NULL,
    Fecha_Salida datetime  NOT NULL,
    Noches int  NOT NULL,
    PrecioTotal float  NOT NULL,
    HotelesId int  NOT NULL
);
GO

-- Se crea la tabla 'Usuarios'
CREATE TABLE Usuarios (
    Id int IDENTITY(1,1) NOT NULL,
    Nombre nvarchar(25)  NOT NULL,
    Apellido1 nvarchar(25)  NOT NULL,
    Apellido2 nvarchar(25)  NOT NULL,
    FechaNacimiento datetime  NOT NULL,
    Email nvarchar(50)  NOT NULL,
    Telefono nvarchar(30)  NOT NULL,
    Direccion nvarchar(70)  NOT NULL,
    Poblacion nvarchar(50)  NOT NULL,
    Provincia nvarchar(25)  NOT NULL,
    Usuario nvarchar(20)  NOT NULL,
    Contraseña nvarchar(50)  NOT NULL
);
GO

-- Se crea la tabla 'Cadenas'
CREATE TABLE Cadenas (
    Id int IDENTITY(1,1) NOT NULL,
    Nombre nvarchar(40)  NOT NULL,
    Ruta_Imagen nvarchar(150)  NOT NULL
);
GO

-- Se crea la tabla 'Administradores'
CREATE TABLE Administradores (
    Id int IDENTITY(1,1) NOT NULL,
    Usuario nvarchar(20)  NOT NULL,
    Contraseña nvarchar(50)  NOT NULL
);
GO

-- --------------------------------------------------
-- Se crean todas las Primary Key
-- --------------------------------------------------

-- Se crea la primary key de 'Habitaciones'
ALTER TABLE Habitaciones
ADD CONSTRAINT PK_Habitaciones
    PRIMARY KEY CLUSTERED (Id ASC);
GO

-- Se crea la primary key de 'Hoteles'
ALTER TABLE Hoteles
ADD CONSTRAINT PK_Hoteles
    PRIMARY KEY CLUSTERED (Id ASC);
GO

-- Se crea la primary key de 'Imagenes'
ALTER TABLE Imagenes
ADD CONSTRAINT PK_Imagenes
    PRIMARY KEY CLUSTERED (Id ASC);
GO

-- Se crea la primary key de 'Reservas'
ALTER TABLE Reservas
ADD CONSTRAINT PK_Reservas
    PRIMARY KEY CLUSTERED (Id ASC);
GO

-- Se crea la primary key de 'Usuarios'
ALTER TABLE Usuarios
ADD CONSTRAINT PK_Usuarios
    PRIMARY KEY CLUSTERED (Id ASC);
GO

-- Se crea la primary key de 'Cadenas'
ALTER TABLE Cadenas
ADD CONSTRAINT PK_Cadenas
    PRIMARY KEY CLUSTERED (Id ASC);
GO

-- Se crea la primary key de 'Administradores'
ALTER TABLE Administradores
ADD CONSTRAINT PK_Administradores
    PRIMARY KEY CLUSTERED (Id ASC);
GO

-- --------------------------------------------------
-- Se crean todas las Foreign Key, índices y sus restricciones on delete cascade necesarias.
-- * Los índices sirven para dar un mayor rendimiento al realizar consultas en base a donde
-- se especifiquen, normalmente primary y foreign keys. Con las primary keys ya se crean índices
-- clustered.
-- --------------------------------------------------

-- Se crea la foreign key en 'Reservas'
ALTER TABLE Reservas
ADD CONSTRAINT FK_HabitacionesReservas
    FOREIGN KEY (HabitacionesId)
    REFERENCES Habitaciones
        (Id)
    ON DELETE CASCADE ON UPDATE NO ACTION;

-- Se crea el índice non-clustered para Foreign key 'FK_HabitacionesReservas'
CREATE INDEX IX_FK_HabitacionesReservas
ON Reservas
    (HabitacionesId);
GO

-- Se crea la foreign key en 'Habitaciones'
ALTER TABLE Habitaciones
ADD CONSTRAINT FK_HotelesHabitaciones
    FOREIGN KEY (HotelesId)
    REFERENCES Hoteles
        (Id)
    ON DELETE CASCADE ON UPDATE NO ACTION;

-- Se crea el índice non-clustered para Foreign key 'FK_HotelesHabitaciones'
CREATE INDEX IX_FK_HotelesHabitaciones
ON Habitaciones
    (HotelesId);
GO

-- Se crea la foreign key en 'Imagenes'
ALTER TABLE Imagenes
ADD CONSTRAINT FK_ImagenesHoteles
    FOREIGN KEY (HotelesId)
    REFERENCES Hoteles
        (Id)
    ON DELETE CASCADE ON UPDATE NO ACTION;

-- Se crea el índice non-clustered para Foreign key 'FK_ImagenesHoteles'
CREATE INDEX IX_FK_ImagenesHoteles
ON Imagenes
    (HotelesId);
GO

-- Se crea la foreign key en 'Reservas'
ALTER TABLE Reservas
ADD CONSTRAINT FK_ReservasUsuarios
    FOREIGN KEY (UsuariosId)
    REFERENCES Usuarios
        (Id)
    ON DELETE CASCADE ON UPDATE NO ACTION;

-- Se crea el índice non-clustered para Foreign key 'FK_ReservasUsuarios'
CREATE INDEX IX_FK_ReservasUsuarios
ON Reservas
    (UsuariosId);
GO

-- Se crea la foreign key en 'Reservas'
ALTER TABLE Reservas
ADD CONSTRAINT FK_HotelesReservas
    FOREIGN KEY (HotelesId)
    REFERENCES Hoteles
        (Id)
    ON DELETE NO ACTION ON UPDATE NO ACTION;

-- Se crea el índice non-clustered para Foreign key 'FK_HotelesReservas'
CREATE INDEX IX_FK_HotelesReservas
ON Reservas
    (HotelesId);
GO

-- Se crea la foreign key en 'Hoteles'
ALTER TABLE Hoteles
ADD CONSTRAINT FK_CadenasHoteles
    FOREIGN KEY (CadenasId)
    REFERENCES Cadenas
        (Id)
    ON DELETE CASCADE ON UPDATE NO ACTION;

-- Se crea el índice non-clustered para Foreign key 'FK_CadenasHoteles'
CREATE INDEX IX_FK_CadenasHoteles
ON Hoteles
    (CadenasId);
GO